/**
 * 聊天在线状态管理
 * 用于所有页面，管理用户的在线/离线状态
 */

(function() {
    'use strict';
    
    // API地址 - 从全局变量获取，如果没有则使用默认值
    var API_BASE_URL = window.API_BASE_URL || "https://api.sc123.shop/";
    
    // 获取或创建UUID
    function getClientUuid() {
        var uuid = localStorage.getItem('chat_client_uuid');
        if (!uuid) {
            // 生成UUID
            uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
                var r = Math.random() * 16 | 0;
                var v = c == 'x' ? r : (r & 0x3 | 0x8);
                return v.toString(16);
            });
            localStorage.setItem('chat_client_uuid', uuid);
        }
        return uuid;
    }
    
    var clientUuid = getClientUuid();
    var statusTimer = null;
    var isOfflineNotified = false;
    var isNavigatingAway = false; // 标记是否正在导航到其他页面
    
    // 更新在线状态
    function updateOnlineStatus() {
        // 如果已经标记为离线或正在导航，不再更新在线状态
        if (isOfflineNotified || isNavigatingAway) {
            return;
        }
        
        try {
            var xhr = new XMLHttpRequest();
            xhr.open('POST', API_BASE_URL + '/api/v1/chat/update_status', true);
            xhr.setRequestHeader('Content-Type', 'application/json');
            xhr.timeout = 5000; // 5秒超时
            xhr.onerror = function() {
                console.error('更新在线状态失败');
            };
            xhr.ontimeout = function() {
                console.error('更新在线状态超时');
            };
            xhr.send(JSON.stringify({
                client_uuid: clientUuid
            }));
        } catch (e) {
            console.error('更新在线状态异常:', e);
        }
    }
    
    // 用户退出/离线通知
    function notifyUserOffline() {
        // 如果已经发送过离线通知，不再重复发送
        if (isOfflineNotified) {
            return;
        }
        
        // 标记为已发送离线通知
        isOfflineNotified = true;
        
        // 清除所有定时器，停止更新在线状态
        if (statusTimer) {
            clearInterval(statusTimer);
            statusTimer = null;
        }
        
        // 使用 sendBeacon API 确保在页面关闭时也能发送请求
        if (navigator.sendBeacon) {
            try {
                var formData = new FormData();
                formData.append('client_uuid', clientUuid);
                var url = API_BASE_URL + '/api/v1/chat/offline';
                // 确保URL格式正确
                if (url.endsWith('/')) {
                    url = url.slice(0, -1);
                }
                if (!url.endsWith('/api/v1/chat/offline')) {
                    url = url.replace(/\/$/, '') + '/api/v1/chat/offline';
                }
                navigator.sendBeacon(url, formData);
                console.log('已发送离线通知 (sendBeacon)');
            } catch (e) {
                console.error('sendBeacon发送失败:', e);
                // 降级到同步XHR
                try {
                    var xhr = new XMLHttpRequest();
                    var url = API_BASE_URL + '/api/v1/chat/offline';
                    xhr.open('POST', url, false);
                    xhr.setRequestHeader('Content-Type', 'application/json');
                    xhr.send(JSON.stringify({ client_uuid: clientUuid }));
                    console.log('已发送离线通知 (同步XHR)');
                } catch (e2) {
                    console.error('发送离线通知失败:', e2);
                }
            }
        } else {
            // 如果不支持 sendBeacon，使用同步 XHR
            try {
                var xhr = new XMLHttpRequest();
                var url = API_BASE_URL + '/api/v1/chat/offline';
                xhr.open('POST', url, false); // 同步请求
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.send(JSON.stringify({
                    client_uuid: clientUuid
                }));
                console.log('已发送离线通知 (同步XHR)');
            } catch (e) {
                console.error('发送离线通知失败:', e);
            }
        }
    }
    
    // 初始化在线状态管理
    function initChatStatus() {
        // 页面加载时立即更新在线状态
        updateOnlineStatus();
        
        // 每30秒更新一次在线状态
        if (statusTimer) {
            clearInterval(statusTimer);
        }
        statusTimer = setInterval(updateOnlineStatus, 30000);
        
        // 监听所有链接点击和表单提交，标记为导航中（但不标记为离线）
        // 这样可以区分页面跳转和页面关闭
        var navigationHandlers = {
            click: function(e) {
                var target = e.target;
                // 向上查找链接元素或按钮元素
                while (target && target.tagName !== 'A' && target.tagName !== 'BUTTON' && target !== document.body) {
                    target = target.parentElement;
                }
                
                // 处理链接点击
                if (target && target.tagName === 'A' && target.href) {
                    // 如果是同域链接，标记为导航中
                    try {
                        var url = new URL(target.href, window.location.href);
                        if (url.origin === window.location.origin) {
                            // 同域链接，标记为导航中
                            isNavigatingAway = true;
                            // 清除定时器，但不要发送离线通知
                            if (statusTimer) {
                                clearInterval(statusTimer);
                                statusTimer = null;
                            }
                        }
                    } catch (e) {
                        // URL解析失败，忽略
                    }
                }
                
                // 处理按钮点击（可能触发页面跳转）
                // 检查按钮是否有onclick属性或者data-href属性
                if (target && target.tagName === 'BUTTON') {
                    var onclick = target.getAttribute('onclick');
                    var dataHref = target.getAttribute('data-href');
                    var className = target.className || '';
                    
                    // 如果按钮的onclick包含location.href或window.location，可能是页面跳转
                    if (onclick && (onclick.indexOf('location.href') !== -1 || onclick.indexOf('window.location') !== -1)) {
                        isNavigatingAway = true;
                        if (statusTimer) {
                            clearInterval(statusTimer);
                            statusTimer = null;
                        }
                    }
                    // 如果按钮有data-href属性，可能是页面跳转
                    if (dataHref) {
                        isNavigatingAway = true;
                        if (statusTimer) {
                            clearInterval(statusTimer);
                            statusTimer = null;
                        }
                    }
                }
            },
            submit: function(e) {
                // 表单提交也可能导致页面跳转
                var form = e.target;
                if (form && form.tagName === 'FORM' && form.action) {
                    try {
                        var url = new URL(form.action, window.location.href);
                        if (url.origin === window.location.origin) {
                            isNavigatingAway = true;
                            if (statusTimer) {
                                clearInterval(statusTimer);
                                statusTimer = null;
                            }
                        }
                    } catch (e) {
                        // URL解析失败，忽略
                    }
                }
            }
        };
        
        // 使用捕获阶段，确保捕获所有点击和提交
        document.addEventListener('click', navigationHandlers.click, true);
        document.addEventListener('submit', navigationHandlers.submit, true);
        
        // 监听popstate事件（浏览器后退/前进）
        window.addEventListener('popstate', function(e) {
            // 浏览器后退/前进也被视为导航
            isNavigatingAway = true;
            if (statusTimer) {
                clearInterval(statusTimer);
                statusTimer = null;
            }
        });
        
        // 也监听 history API 的导航
        var originalPushState = history.pushState;
        var originalReplaceState = history.replaceState;
        var originalBack = history.back;
        var originalGo = history.go;
        
        if (originalPushState) {
            history.pushState = function() {
                isNavigatingAway = true;
                if (statusTimer) {
                    clearInterval(statusTimer);
                    statusTimer = null;
                }
                return originalPushState.apply(history, arguments);
            };
        }
        if (originalReplaceState) {
            history.replaceState = function() {
                isNavigatingAway = true;
                if (statusTimer) {
                    clearInterval(statusTimer);
                    statusTimer = null;
                }
                return originalReplaceState.apply(history, arguments);
            };
        }
        if (originalBack) {
            history.back = function() {
                isNavigatingAway = true;
                if (statusTimer) {
                    clearInterval(statusTimer);
                    statusTimer = null;
                }
                return originalBack.apply(history, arguments);
            };
        }
        if (originalGo) {
            history.go = function() {
                isNavigatingAway = true;
                if (statusTimer) {
                    clearInterval(statusTimer);
                    statusTimer = null;
                }
                return originalGo.apply(history, arguments);
            };
        }
        
        // 监听页面卸载事件
        // 注意：在移动设备上，beforeunload可能不会触发，所以我们主要依赖pagehide
        window.addEventListener('beforeunload', function() {
            // 如果是导航到其他页面，不标记为离线
            // 但如果是真正的页面关闭（关闭浏览器/标签页），标记为离线
            if (!isNavigatingAway) {
                // 使用sendBeacon立即发送，因为beforeunload事件中异步请求可能不会完成
                notifyUserOffline();
            }
        });
        
        // 监听页面隐藏事件（比beforeunload更可靠，特别是在移动设备上）
        // 这是处理移动设备页面关闭的最可靠方式
        window.addEventListener('pagehide', function(e) {
            // 如果页面被缓存（persisted为true），表示页面可能被浏览器缓存
            // 用户可能还会回来，所以不标记为离线
            if (e.persisted) {
                // 页面被缓存，用户可能还会回来，不标记为离线
                console.log('页面被缓存，不标记为离线');
                return;
            }
            
            // 页面被完全卸载（persisted为false）
            // 在移动设备上，即使是从一个页面跳转到另一个页面，原页面也可能不会被缓存
            // 所以我们需要更准确的判断：只有在不是导航的情况下，才标记为离线
            // 但是，如果用户关闭了浏览器或标签页，isNavigatingAway应该是false
            // 所以我们只在isNavigatingAway为false时标记为离线
            
            // 使用setTimeout确保在事件处理完成后检查isNavigatingAway
            // 但实际上，由于事件是同步的，如果之前有链接点击，isNavigatingAway应该已经是true了
            var wasNavigating = isNavigatingAway;
            
            // 如果isNavigatingAway为false，说明不是导航，是真正的页面关闭
            if (!wasNavigating) {
                console.log('页面关闭（非导航），标记为离线');
                notifyUserOffline();
            } else {
                console.log('页面跳转（导航），不标记为离线');
            }
        });
        
        // 监听页面可见性变化
        document.addEventListener('visibilitychange', function() {
            if (document.hidden) {
                // 页面隐藏时，不立即标记为离线
                // 因为用户可能只是切换到其他标签页或应用，还会回来
                // 只有在页面真正关闭时（beforeunload/pagehide）才标记为离线
                console.log('页面隐藏，但不标记为离线');
            } else {
                // 页面重新显示时，重置离线标记并更新在线状态
                isOfflineNotified = false;
                isNavigatingAway = false;
                updateOnlineStatus();
                // 重新启动定时器
                if (!statusTimer) {
                    statusTimer = setInterval(updateOnlineStatus, 30000);
                }
            }
        });
        
        // 页面获得焦点时更新状态（用户回到页面）
        window.addEventListener('focus', function() {
            // 重置离线标记和导航标记
            isOfflineNotified = false;
            isNavigatingAway = false;
            updateOnlineStatus();
            // 重新启动定时器
            if (!statusTimer) {
                statusTimer = setInterval(updateOnlineStatus, 30000);
            }
        });
        
        // 页面从缓存中恢复时（bfcache）
        window.addEventListener('pageshow', function(e) {
            // 重置离线标记和导航标记
            isOfflineNotified = false;
            isNavigatingAway = false;
            updateOnlineStatus();
            // 重新启动定时器
            if (!statusTimer) {
                statusTimer = setInterval(updateOnlineStatus, 30000);
            }
        });
    }
    
    // 导出全局函数
    window.ChatStatus = {
        init: initChatStatus,
        updateStatus: updateOnlineStatus,
        getClientUuid: function() { return clientUuid; },
        setApiBaseUrl: function(url) { API_BASE_URL = url; }
    };
    
    // 如果DOM已经加载完成，立即初始化
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initChatStatus);
    } else {
        // DOM已经加载完成，立即初始化
        initChatStatus();
    }
    
    // 也监听window.onload，确保在所有资源加载完成后也能初始化
    window.addEventListener('load', function() {
        if (!statusTimer) {
            initChatStatus();
        }
    });
})();

